/* Forms */
:root {
    --input-bg-color: var(--body-color);
    --input-disabled-bg-color: var(--gray-100);
    --input-text-color: var(--text-color);
    --input-hint-color: var(--secondary-text-color);
    --input-border-color: var(--border-color);
    --input-placeholder-color: var(--tertiary-text-color);
    --input-box-shadow: var(--box-shadow-xs);

    --checkbox-bg-color: var(--body-color);
    --checkbox-checked-bg-color: var(--primary-color);
    --checkbox-disabled-bg-color: var(--gray-100);
    --checkbox-border-color: var(--border-color);
    --checkbox-icon-color: #fff;

    --switch-bg-color: var(--gray-300);
    --switch-border-color: var(--gray-400);
    --switch-toggle-color: #fff;
}

.form-group {
    &:first-of-type {
        margin-top: var(--unit-4);
    }
    &:not(:last-child) {
        margin-bottom: var(--unit-4);
    }
}

fieldset {
    margin-bottom: var(--layout-spacing-lg);
}

legend {
    font-size: var(--font-size-lg);
    font-weight: 500;
    margin-bottom: var(--layout-spacing-lg);
}

/* Form element: Label */
.form-label {
    display: block;
    line-height: var(--line-height);
    margin-bottom: var(--unit-2);
    font-weight: 500;
}

details summary .form-label {
    margin-bottom: 0;
}

details[open] summary .form-label {
    margin-bottom: var(--unit-2);
}

/* Form element: Input */
.form-input {
    appearance: none;
    background: var(--input-bg-color);
    background-image: none;
    border: var(--border-width) solid var(--input-border-color);
    border-radius: var(--border-radius);
    box-shadow: var(--input-box-shadow);
    color: var(--input-text-color);
    display: block;
    font-size: var(--font-size);
    height: var(--control-size);
    line-height: var(--line-height);
    max-width: 100%;
    outline: none;
    padding: var(--control-padding-y) var(--control-padding-x);
    position: relative;
    transition: background 0.2s, border 0.2s, color 0.2s;
    width: 100%;

    &:focus {
        outline: var(--focus-outline);
        outline-offset: calc(var(--focus-outline-offset) * -1);
    }

    &::placeholder {
        color: var(--input-placeholder-color);
        opacity: 1;
    }

    /* Input sizes */

    &.input-sm {
        font-size: var(--font-size-sm);
        height: var(--control-size-sm);
        padding: var(--control-padding-y-sm) var(--control-padding-x-sm);
    }

    &.input-lg {
        font-size: var(--font-size-lg);
        height: var(--control-size-lg);
        padding: var(--control-padding-y-lg) var(--control-padding-x-lg);
    }

    &.input-inline {
        display: inline-block;
        vertical-align: middle;
        width: auto;
    }

    /* Input types */

    &[type="file"] {
        height: auto;
    }
}

/* Form element: Textarea */
textarea.form-input {
    &,
    &.input-lg,
    &.input-sm {
        height: auto;
    }
}

/* Form element: Input hint */
.form-input-hint {
    color: var(--input-hint-color);
    font-size: var(--font-size-sm);
    margin-top: var(--unit-1);

    .has-success &,
    .is-success + & {
        color: var(--success-color);
    }

    .has-error &,
    .is-error + & {
        color: var(--error-color);
    }
}

/* Form element: Select */
.form-select {
    appearance: none;
    background: var(--input-bg-color);
    border: var(--border-width) solid var(--input-border-color);
    border-radius: var(--border-radius);
    box-shadow: var(--input-box-shadow);
    color: var(--input-text-color);
    font-size: var(--font-size);
    height: var(--control-size);
    line-height: var(--line-height);
    outline: none;
    padding: var(--control-padding-y) var(--control-padding-x);
    vertical-align: middle;
    width: 100%;

    &:focus {
        outline: var(--focus-outline);
        outline-offset: calc(var(--focus-outline-offset) * -1);
    }

    /* Select sizes */

    &.select-sm {
        font-size: var(--font-size-sm);
        height: var(--control-size-sm);
        padding: var(--control-padding-y-sm) calc(var(--control-icon-size) + var(--control-padding-x-sm)) var(--control-padding-y-sm) var(--control-padding-x-sm);
    }

    &.select-lg {
        font-size: var(--font-size-lg);
        height: var(--control-size-lg);
        padding: var(--control-padding-y-lg) calc(var(--control-icon-size) + var(--control-padding-x-lg)) var(--control-padding-y-lg) var(--control-padding-x-lg);
    }

    /* Multiple select */

    &[size],
    &[multiple] {
        height: auto;
        padding: var(--control-padding-y) var(--control-padding-x);

        & option {
            padding: var(--unit-h) var(--unit-1);
        }
    }

    &:not([multiple]):not([size]) {
        background: var(--input-bg-color) url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%204%205'%3E%3Cpath%20fill='%23667189'%20d='M2%200L0%202h4zm0%205L0%203h4z'/%3E%3C/svg%3E") no-repeat right .35rem center / .4rem .5rem;
        padding-right: calc(var(--control-icon-size) + var(--control-padding-x));
    }
}

/* Form element: Checkbox and Radio */
.form-checkbox,
.form-radio,
.form-switch {
    display: block;
    line-height: var(--line-height);
    margin: calc((var(--control-size) - var(--control-size-sm)) / 2) 0;
    min-height: var(--control-size-sm);
    padding: calc((var(--control-size-sm) - var(--line-height)) / 2) var(--control-padding-x) calc((var(--control-size-sm) - var(--line-height)) / 2) calc(var(--control-icon-size) + var(--control-padding-x));
    position: relative;

    input {
        clip: rect(0, 0, 0, 0);
        height: 1px;
        margin: -1px;
        overflow: hidden;
        position: absolute;
        width: 1px;

        &:focus-visible + .form-icon {
            outline: var(--focus-outline);
            outline-offset: var(--focus-outline-offset);
        }

        &:checked + .form-icon {
            background: var(--checkbox-checked-bg-color);
            border-color: var(--checkbox-checked-bg-color);
        }
    }

    .form-icon {
        border: var(--border-width) solid var(--checkbox-border-color);
        box-shadow: var(--input-box-shadow);
        cursor: pointer;
        display: inline-block;
        position: absolute;
        transition: background .2s, border .2s, color .2s;
    }

    /* Input checkbox, radio, and switch sizes */

    &.input-sm {
        font-size: var(--font-size-sm);
        margin: 0;
    }

    &.input-lg {
        font-size: var(--font-size-lg);
        margin: calc((var(--control-size-lg) - var(--control-size-sm)) / 2) 0;
    }
}

.form-checkbox,
.form-radio {
    .form-icon {
        background: var(--checkbox-bg-color);
        height: var(--control-icon-size);
        left: 0;
        top: calc((var(--control-size-sm) - var(--control-icon-size)) / 2);
        width: var(--control-icon-size);
    }
}

.form-checkbox {
    font-weight: 500;

    .form-icon {
        border-radius: var(--border-radius);
    }

    input {
        &:checked + .form-icon {
            &::before {
                background-clip: padding-box;
                border: var(--border-width-lg) solid var(--checkbox-icon-color);
                border-left-width: 0;
                border-top-width: 0;
                content: "";
                height: 9px;
                left: 50%;
                margin-left: -3px;
                margin-top: -6px;
                position: absolute;
                top: 50%;
                transform: rotate(45deg);
                width: 6px;
            }
        }

        &:indeterminate + .form-icon {
            background: var(--checkbox-checked-bg-color);
            border-color: var(--checkbox-checked-bg-color);

            &::before {
                background: var(--checkbox-icon-color);
                content: "";
                height: 2px;
                left: 50%;
                margin-left: -5px;
                margin-top: -1px;
                position: absolute;
                top: 50%;
                width: 10px;
            }
        }
    }
}

.form-radio {
    .form-icon {
        border-radius: 50%;
    }

    input {
        &:checked + .form-icon {
            &::before {
                background: var(--checkbox-icon-color);
                border-radius: 50%;
                content: "";
                height: 6px;
                left: 50%;
                position: absolute;
                top: 50%;
                transform: translate(-50%, -50%);
                width: 6px;
            }
        }
    }
}

/* Form element: Switch */
.form-switch {
    padding-left: calc(var(--unit-8) + var(--control-padding-x));

    .form-icon {
        background: var(--switch-bg-color);
        background-clip: padding-box;
        border-color: var(--switch-border-color);
        border-radius: calc(var(--unit-2) + var(--border-width));
        height: calc(var(--unit-4) + var(--border-width) * 2);
        left: 0;
        top: calc((var(--control-size-sm) - var(--unit-4)) / 2 - var(--border-width));
        width: var(--unit-8);

        &::before {
            background: var(--switch-toggle-color);
            border-radius: 50%;
            content: "";
            display: block;
            height: var(--unit-4);
            left: 0;
            position: absolute;
            top: 0;
            transition: background .2s, border .2s, color .2s, left .2s;
            width: var(--unit-4);
        }
    }

    input {
        &:checked + .form-icon {
            &::before {
                left: 14px;
            }
        }
    }
}

/* Form Icons */
.has-icon-left,
.has-icon-right {
    position: relative;

    .form-icon {
        height: var(--control-icon-size);
        margin: 0 var(--control-padding-y);
        position: absolute;
        top: 50%;
        transform: translateY(-50%);
        width: var(--control-icon-size);
        z-index: calc(var(--zindex-0) + 1);
    }
}

.has-icon-left {
    & .form-icon {
        left: var(--border-width);
    }

    & .form-input {
        padding-left: calc(var(--control-icon-size) + var(--control-padding-y) * 2);
    }
}

.has-icon-right {
    & .form-icon {
        right: var(--border-width);
    }

    & .form-input {
        padding-right: calc(var(--control-icon-size) + var(--control-padding-y) * 2);
    }
}


/* Form element: Input groups */
.input-group {
    display: flex;

    .input-group-addon {
        background: var(--body-color);
        border: var(--border-width) solid var(--input-border-color);
        border-radius: var(--border-radius);
        line-height: var(--line-height);
        padding: var(--control-padding-y) var(--control-padding-x);
        white-space: nowrap;

        &.addon-sm {
            font-size: var(--font-size-sm);
            padding: var(--control-padding-y-sm) var(--control-padding-x-sm);
        }

        &.addon-lg {
            font-size: var(--font-size-lg);
            padding: var(--control-padding-y-lg) var(--control-padding-x-lg);
        }
    }

    .form-input,
    .form-select {
        flex: 1 1 auto;
        width: 1%;
    }

    .input-group-btn {
        z-index: var(--zindex-0);
    }

    .form-input,
    .form-select,
    .input-group-addon,
    .input-group-btn {
        &:first-child:not(:last-child) {
            border-bottom-right-radius: 0;
            border-top-right-radius: 0;
        }

        &:not(:first-child):not(:last-child) {
            border-radius: 0;
            margin-left: calc(-1 * var(--border-width));
        }

        &:last-child:not(:first-child) {
            border-bottom-left-radius: 0;
            border-top-left-radius: 0;
            margin-left: calc(-1 * var(--border-width));
        }

        &:focus {
            z-index: calc(var(--zindex-0) + 1);
        }
    }

    .form-select {
        width: auto;
    }

    &.input-inline {
        display: inline-flex;
    }
}

/* Form validation states */
.form-input,
.form-select {
    .has-success &,
    &.is-success {
        background: var(--success-color-shade);
        border-color: var(--success-color);

        &:focus {
            outline-color: var(--success-color);
        }
    }

    .has-error &,
    &.is-error {
        background: var(--error-color-shade);
        border-color: var(--error-color);

        &:focus {
            outline-color: var(--error-color);
        }
    }
}

/* Form disabled and readonly */
.form-input,
.form-select {
    &:disabled,
    &.disabled {
        background-color: var(--input-disabled-bg-color);
        cursor: not-allowed;
    }
}

input {
    &:disabled,
    &.disabled {
        & + .form-icon {
            background: var(--checkbox-disabled-bg-color);
            cursor: not-allowed;
        }
    }
}

/* Increase input font size on small viewports to prevent zooming on focus the input */
/* on mobile devices. 430px relates to the "normalized" iPhone 14 Pro Max */
/* viewport size */
@media screen and (max-width: 430px) {
    .form-input {
        font-size: 16px;
    }
}
